package com.zx.idc.backend.gui.common.base;

import com.zx.idc.common.ref.ClassGenericUtil;
import com.zx.idc.common.spring.SpringBeanUtil;
import com.zx.idc.ds.common.entity.BaseEntity;
import com.zx.idc.ds.common.service.BaseService;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 基础 api 工具类
 *
 * @author rxliuli
 */
public class BaseApiUtil {
    /**
     * 获取到泛型类上的 Service {@link Class} 对象
     *
     * @param clazz 当前运行的 class 类型对象（子类对象类型）
     * @param <S>   服务类类型
     * @param <E>   实体类类型
     * @return 服务类的 Bean 实例
     */
    public static <S extends BaseService<E>, E extends BaseEntity> Optional<S> getGenericClassService(Class<?> clazz, Class<?> interfaceClazz) {
        final Map<Class<?>, List<Class<?>>> map = ClassGenericUtil.getInterfaceTypeParamsForRecursive(clazz);
        return map.getOrDefault(interfaceClazz, Collections.emptyList()).stream()
            .filter(BaseService.class::isAssignableFrom)
            .findFirst()
            .map(SpringBeanUtil::getBean)
            .map(service -> (S) service);
    }

    /**
     * 获取到泛型类上的 Entity {@link Class} 对象
     *
     * @param clazz 当前运行的 class 类型对象（子类对象类型）
     * @param <S>   服务类类型
     * @param <E>   实体类类型
     * @return 实体类的 Bean 实例
     */
    public static <S extends BaseService<E>, E extends BaseEntity> Optional<S> getGenericClassEntity(Class<?> clazz, Class<?> interfaceClazz) {
        final Map<Class<?>, List<Class<?>>> map = ClassGenericUtil.getInterfaceTypeParamsForRecursive(clazz);
        return map.getOrDefault(interfaceClazz, Collections.emptyList()).stream()
            .filter(BaseEntity.class::isAssignableFrom)
            .findFirst()
            .map(SpringBeanUtil::getBean)
            .map(service -> (S) service);
    }
}
